package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.service.dto.user.UserUserRoleDTO;

import java.util.List;

/**
 * 用户与角色的关联业务
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2023/3/4 14:30
 */
public interface UserUserRoleService {

    /**
     * 根据条件查询用户与角色的关联关系
     *
     * @param userUserRoleDTO
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2023/3/4 14:30
     */
    ServiceResult<List<UserUserRoleDTO>> listByCondition(UserUserRoleDTO userUserRoleDTO);

    /**
     * 创建用户与角色的关联关系
     *
     * @param userUserRoleDTO
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/8 21:54
     */
    ServiceResult<String> insert(UserUserRoleDTO userUserRoleDTO);

    /**
     * 根据userId删除用户与角色的关联关系
     *
     * @param userId
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/9 10:37
     */
    ServiceResult<Object> deleteByUserId(String userId);

    /**
     * 批量插入userId与roleId的关联关系列表
     *
     * @param orgId
     * @param userId
     * @param roleIdList
     * @param currentId  当前登陆用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/9 11:04
     */
    ServiceResult<Object> insertUserRoleList(String orgId, String userId, List<String> roleIdList, String currentId);

    /**
     * 根据roleIdList获取userIdList
     *
     * @param roleIdsList
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/14 17:13
     */
    List<String> listByRoleIdList(List<String> roleIdsList);

    /**
     * 根据角色id获取userId列表
     *
     * @param roleId 角色id
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/17 10:23
     */
    ServiceResult<List<String>> listUserIdsByRoleId(String roleId);

    /**
     * 设置某个角色的关联用户
     *
     * @param orgId         公司id
     * @param roleId        角色id
     * @param userIds       用户列表
     * @param opreateUserId 操作用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/17 12:36
     */
    ServiceResult<Boolean> updateRoleUsers(String orgId, String roleId, List<String> userIds, String opreateUserId);

    /**
     * 根据用户id获取roleId列表
     *
     * @param userId 用户id
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/03/17 15:23
     */
    ServiceResult<List<String>> listRoleIdsByUserId(String userId);

    /**
     * 检查用户的角色是否变化，如果变化则更新用户角色表
     *
     * @param orgId         公司id
     * @param userId        用户id
     * @param newRoleIdList 新的角色id列表
     * @param oldRoleIdList 旧的角色id列表
     * @param currentId     当前登陆用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/18 18:33
     */
    ServiceResult<Boolean> checkUserRoleChangeAndUpdate(String orgId, String userId, List<String> newRoleIdList, List<String> oldRoleIdList, String currentId);


    /**
     * 检查用户的角色中是否对超级管理员的角色增减操作,如果是则需要发送消息至python 清理历史数据
     *
     * @param orgId         公司id
     * @param userId        用户id
     * @param newRoleIdList 需要更新的角色id
     * @param oldRoleIdList 数据库中的角色id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/18 19:35
     */
    ServiceResult<Boolean> checkSeniorRole(String orgId, String userId, List<String> newRoleIdList, List<String> oldRoleIdList);

    /**
     * 根据主键有选择的做更新
     *
     * @param userUserRoleDTO 用户角色关系
     * @return java.lang.Integer 更新成功的条数
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/03/16 11:24
     */
    ServiceResult<Integer> updateSelectiveById(UserUserRoleDTO userUserRoleDTO);

    /**
     * 根据roleId删除
     *
     * @param roleId
     * @return java.lang.Integer
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/05/10 16:53
     */
    ServiceResult<Integer> deleteByRoleId(String roleId);
}
